对于操作系统实验的最后感想,依托达芬我毫无收获,看着这狗屁引导,从这狗屁的实现教程中,除了第一次的键盘输入,我没有亲手写哪怕一行代码!!!https://github.com/heorion/npu-nwpu-oslab-geekos-project0-4
去吧,这里有前辈的实现整理,你还想什么呢?
我不是天才
我们也遇不到适合普通人的课程设计了
实验要求:了解虚拟存储器管理设计原理,掌握请求分页虚拟存储管理的具体实现技术。
过程总览
段式先将逻辑地址映射成线性地址;
页式将线性地址映射成物理地址;
请求分页机制的实现;
创建页目录PGD和页表PT数据结构;
系统全局页链表g_pageList,s_freeList;
初始化页面文件数据结构;
实现页为页面文件分配与释放磁盘块;
实现页读写页数据函数的实现;
实现页内核缓冲区与用户缓冲区之间的数据交换;
实现用户级进程在分页系统中的创建,执行与销毁。
项目设计原理为了实现分页存储系统的地址转换机制,系统增如了个新的寄存器CR3作为指向当前页目录的指针。这样,从线性地址到物现地址的映射过程为:
从CR3取得页目录的基地址;以线性地...
前言
最最重要的前言!!!!!
802.3(以太网)帧结构
802.11(Wi-Fi)帧结构
原理
过程
功能点与代码对应关系
完整代码
1. 高级抽象和内置功能
2. 自动处理细节
3. 简洁的语法
4. 动态类型和交互性
5. 丰富的社区支持和文档
具体对比
读取文件
分割数据
创建和发送以太网帧
总结
以太网帧(Ethernet Frame)的定义
主要属性
示例
内部实现
Ether 类定义
字段解释
常见的以太网类型
构造和解析以太网帧
构造以太网帧
解析以太网帧
填充(Padding)
总结
自动处理 CRC 校验码
发送以太网帧
手动计算 CRC 校验码
手动计算 CRC 校验码
解析和验证 CRC 校验码
解析和验证 CRC 校验码
总结
生成多项式 G(X) 和 CRC-32
1. 生成多项式 G(X)
2. CRC-32
CRC-32 的计算过程
Python 实现 CRC-32
输出
Scapy 中的 CRC-32
发送以太网帧
总结
<仍在编辑中>
前言C++实现就自己汇报用了,python实...
Socket接口
1. 实验目的
2. 实验环境
3. 实验原理
3.1 网络进程间通信
3.2 Client/Server模式
1. 服务端初始化
2. 客户端初始化
3. 数据传输
4. 断开连接
建立连接
数据传输可靠性
系统资源需求
3.3 Socket编程接口
Socket编程接口的主要API函数
1. socket()
2. bind()
3. listen()
4. accept()
5. connect()
6. send()
7. recv()
8. sendto()
9. recvfrom()
10. closesocket()
TCP与UDP在Socket编程中的不同之处
1. 连接方式
2. 数据传输可靠性
3. 数据传输模式
4. 系统资源需求
5. 系统函数调用
6. 客户端和服务端的识别
7. 适用场景
4. 实验内容与步骤
4.1 基于TCP协议的通信编程
4.2 基于UDP协议的通信编程
5. 实验结果与分析
6. 总结与体会
7. 附录
注:以下为本人实验报告原文,切勿直接copy实验报告采用C++代码分享...
前言:操作系统系列实验的blog比较抽象,如有需要可以直接去搬我上传的项目直接用毕竟这几篇都是汇报检查是我打的草稿,内容很乱链接如下:可运行项目文件直达
注意:
这几个项目无需求直接 boch 运行即可,make编译报错解决方案如下该项目是可以直接运行的,不用麦克编译,如果你编译报错并且弹出gcc和一个路径字样说明是gcc版本问题如图:project3make报错解决
(系统里那个路径下自带的是4.4和4.4.3的gcc),而这个项目太老运行需要3.4.6的(更新降级又太麻烦),这里介绍一个简单的方法。
1234sudo -icp -R /usr/lib/gcc/i486-linux-gnu/4.4.3 /usr/lib/gcc/i486-linux-gnu/3.4.6cp /usr/lib/gcc/i486-linux-gnu/3.4.6/include-fixed/limits.h /usr/lib/gcc/i486-linux-gnu/3.4.6/include/cp /usr/lib/gcc/i486-linux-gnu/3.4.6/include-fixed/sys...
B+树的功能实现1. 在insertToNode函数中,完成if语句中的两个TODO。此时你的代码应该可以完成简单的数据插入、判断重复的key,能够通过测试样例1。123456789101112131415161718192021222324252627282930313233343536long insertToNode(Node *node, long key, long value) { if (node->n > MAX_KEY) { return -1; // 已经超过MAX_KEY了,说明split功能没有写好,要检查splitNode函数 } long current_idx = searchKeyInNode(node, key); if (node->isLeaf) { // 如果已存在相同的键,返回-1 if (current_idx > -1 && node->key[current_idx] == key)...
针对 SPJ_MNG 数据库,创建并执行存储过程第1关:创建一个无参数的存储过程—jsearch1123456789101112131415-- 使用指定的数据库USE SPJ_MNG;-- 更改语句结束符为 //DELIMITER //-- 创建存储过程 jsearch1CREATE PROCEDURE jsearch1()BEGIN -- 查询 S 表中城市为北京的所有记录 SELECT * FROM s WHERE CITY = '北京';END //-- 恢复默认的语句结束符为 ;DELIMITER ;
第2关:创建带输入参数的存储过程—jsearch2123456789101112131415-- 使用指定的数据库USE SPJ_MNG;-- 更改语句结束符为 //DELIMITER //-- 创建存储过程 jsearch2CREATE PROCEDURE jsearch2(IN city_name VARCHAR(10))BEGIN -- 查询 S 表中城市为 city_name 的所有记录 SELECT * FROM s...
前言:操作系统系列实验的blog比较抽象,如有需要可以直接去搬我上传的项目直接用毕竟这几篇都是汇报检查是我打的草稿,内容很乱链接如下:可运行项目文件直达
参考来源:1.操作系统课程设计geekos project1-3
2.操作系统课程设计
总结用户态进程创建流程在GeekOS中,用户态进程的创建涉及多个步骤,从加载可执行文件到最终将新进程加入就绪队列等待运行。下面是用户态进程创建的主要流程总结:
调用 Spawn 函数:
Spawn 函数是创建用户态进程的入口点。
该函数接收要加载的可执行文件路径 (program) 和命令行参数 (command) 以及指向 Kernel_Thread 的指针 (pThread)。
读取可执行文件:
使用 Read_Fully 函数将可执行文件的内容读入内存缓冲区。
解析 ELF 文件:
调用 Parse_ELF_Executable 函数分析 ELF 格式的可执行文件,获取段信息、入口地址等关键数据。
初始化并加载用户程序:
调用 Load_User_Program 函数来处理以下任务:
计算用户程序所需的内存空间,包...
前言:操作系统系列实验的blog比较抽象,如有需要可以直接去搬我上传的项目直接用毕竟这几篇都是汇报检查是我打的草稿,内容很乱链接如下:可运行项目文件直达
实验二:ELF可执行文件加载注意!!!!首先,确保修改makefile中的177,178行推荐点击桌面的linktowork,将makefile——boshsrc中的project1中的文件,替换你的实验目录中的两个文件(makefile和boshsrc)
12GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS)CC_GENERAL_OPTS := $(GENERAL_OPTS) -fno-stack-protector
任务一 1.修改Project1项目中的/GeekOS/elf.c文件:在函数Parse_ELF_Executable()中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头),获取可执行文件长度、代码段、数据段等信息,并打印输出。并且,填充Exe_Format数据结构中的值域。
解析:该任务我们只需要修改/GeekOS/e...
太累了,不想好好写了,就发个草稿了
前言:操作系统系列实验的blog比较抽象,如有需要可以直接去搬我上传的项目直接用毕竟这几篇都是汇报检查是我打的草稿,内容很乱链接如下:可运行项目文件直达
geekos键盘驱动12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616...
Canny 边缘检测参考:Canny 边缘检测
目标Canny 边缘检测的概念用于该函数的 OpenCV 函数 : cv.Canny()
理论Canny Edge Detection 是一种流行的边缘检测算法。
1.这是一个多阶段算法,我们将介绍每个阶段。2.Noise Reduction由于边缘检测容易受到图像中杂色的影响,因此第一步是使用 5x5 高斯滤波器去除图像中的杂色。我们在前面的章节中已经看到了这一点。
3.求图像的强度梯度然后,使用 Sobel 核在水平和垂直方向上过滤平滑后的图像,以获得水平方向的一阶导数 (Gx) 和垂直方向 (Gy).从这两张图片中,我们可以找到每个像素的边缘渐变和方向,如下所示:
$$Edge_Gradient ; (G) = \sqrt{G_x^2 + G_y^2} \ Angle ; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg)$$
渐变方向始终垂直于边缘。它四舍五入为代表垂直、水平和两个对角线方向的四个角之一。
4.Non-maximum Suppression在获...